在今天的課題當中,我們要透過滑鼠事件屬性以及 CSS 屬性,在頁面上做出聚光燈。[1]
實作連結
在前面的章節中,我們學過幾個跟滑鼠位置以及 DOM 上元素位置的屬性,而今天我們要利用新的方法 Element.getBoundingClientRect()
。[2]Element.getBoundingClientRect()
方法,會回傳一 DOMRect
物件,該物件中包含將該元素的大小,以及目前在可視區域中的位置的資料:
DOMRect.top
:元素於目前可視範圍中,距離上方邊界的距離。DOMRect.bottom
:元素於目前可視範圍中,距離下方邊界的距離。DOMRect.left
:元素於目前可視範圍中,距離左邊邊界的距離。DOMRect.right
:元素於目前可視範圍中,距離右邊邊界的距離。DOMRect.x
:元素於目前可視範圍中,水平方向的座標。DOMRect.y
:元素於目前可視範圍中,垂直方向的座標。DOMRect.width
:元素的寬。DOMRect.height
:元素的高。在之前的章節中,我們有使用過元素的 offsetLeft
以及 offsetTop
屬性,但這兩個屬性所得到的值,為子元素在父元素中的位置,如果遇到包了許多層父元素的話,就會變得難以計算。
而透過 DOMRect
物件,我們可以直接利用其中的屬性,結合前面學的 scrollX
以及 scrollY
取得捲動量多寡,就可以簡單計算出我們需要的位置資訊。
在今天的課題當中,我們的目的是將所有的 <a>
元素加上聚光燈的效果,因此我們需要先加上監聽事件 mouseover
,此事件會在滑鼠移入該元素的時候觸發:
document.querySelectorAll('a').forEach(function(item) {
item.addEventListener('mouseover', move);
});
要做出聚光燈移動的效果,我們就要在 DOM 中新增出一個元素,並讓他在 mouseover
事件發生時,能移動到我們觸發事件元素的位置,因此我們先建好一個 .highlight
元素,並設定此元素寬跟高都為0,並在觸發的函式中,並透過DOMRect
物件,將指定元素的寬與高指派給 .highlight
元素,而位置的計算可能遇到頁面的捲動而產生誤差,因此要再加上捲動值:
const highLight = document.querySelector('.highLight');
function move (event) {
let positionData = event.target.getBoundingClientRect();
let xPosition = positionData.left + window.scrollX;
let yPosition = positionData.top + window.scrollY;
let elementWidth = positionData.width;
let elementHeight = positionData.height;
highLight.style.left = `${xPosition}px`;
highLight.style.top = `${yPosition}px`;
highLight.style.width = `${elementWidth}px`;
highLight.style.height = `${elementHeight}px`;
};
完成以上的設定之後,再透過 CSS屬性的設定,就能做出聚光燈移動的效果!
.highLight {
width: 0;
height: 0;
transition: all 0.2s;
border-bottom:2px solid white;
position: absolute;
top:100px;
background:white;
left:100px;
z-index: -1;
border-radius:20px;
display: block;
box-shadow: 0 0 10px rgba(0,0,0,0.2);
}
今天我們學到 Element.getBoundingClientRect()
方法以及 DOMRect
物件,透過這個物件,我們能更快取得元素目前於頁面上的位置,並透過結合 CSS 屬性,我們成功在頁面上做出了聚光燈的效果!